package xml;

import cn.hutool.core.util.XmlUtil;
import org.apache.commons.lang3.StringUtils;
import org.w3c.dom.*;

import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class UseageExample {
//    总结
//    XmlUtil只是w3c dom的简单工具化封装，减少操作dom的难度，如果项目对XML依赖较大，依旧推荐Dom4j框架。

    public static void main(String[] args) {
        // 读XML文件
        Document document = XmlUtil.readXML(new File("D:/work/xikuan/biz/out/artifacts/mfbgs_war_exploded/WEB-INF/config/init/xml/init-attach.xml"));
        // 解析XML文件
        useJDKMethod(document);

//        usehutool(document);

    }

    /**
     * 用JDK里面的类
     * @param document
     */
    private static void useJDKMethod(Document document) {
        // 获取根节点名称
        String rootName = document.getDocumentElement().getTagName();
        System.out.println(rootName);


/*        System.out.println("递归解析--------------begin------------------");
        // 递归解析Element
        Element element = document.getDocumentElement();
        parseElement(element);
        System.out.println("递归解析--------------end------------------");*/

        Element element = document.getDocumentElement();
        parseElementTest(element);
        // 拿第一级
//        parseFirstElement(element);
    }

    /**
     * 解析第一级
     * TagName： attach-config
     * @param element
     */
    private static void parseFirstElement(Element element) {
        Map map = new HashMap();
        map.put( element.getTagName(), element.getAttribute(element.getTagName()));


    }

    /**
     *
     */




    /**
     *
     * 顶级就是 TagName： attach-config
     * 下一级就是 TagName：item 属性：（属性,值）： （name,顶级虚拟标签)
     * 下一级就是 TagName：item 属性：（属性,值）： （bill_type,DECALRE） (name,单据类型)  (parent_id,1)
     * 下一级就是 TagName：item 属性：（属性,值）： （region_name,项目资料） (region_id,material)   (max_size,-)   (min_size,-)
     * @param element
     */
//    private static void mfbParseElementToList(Element element) {
//        Map billType = new HashMap();
//        billType.put("bill_type",);
//    }


    /**
     *  用hutool工具包封装的类
     * @param document
     */
    private static void usehutool(Document document) {
        // 获取根节点名称
        Element rootElement = XmlUtil.getRootElement(document);
        StringBuilder tagName = new StringBuilder(rootElement.getTagName()),attributeValue = new StringBuilder(rootElement.getAttribute(tagName.toString()));
        System.out.println(tagName.toString() + attributeValue.toString());

        // 简写
//        System.out.println(XmlUtil.getRootElement(document).getTagName() + XmlUtil.getRootElement(document).getAttribute(XmlUtil.getRootElement(document).getTagName()));


//        Element element = document2.getDocumentElement();
//        // 操作XML文件
//        List<Element> attachConfig =  XmlUtil.getElements(element,"attach-config");
//        for (int i = 0; i < attachConfig.size(); i++) {
//            System.out.println(attachConfig.get(i).toString());
//        }
    }


    /**
     * 递归解析Element
     * @param element
     */
    private static void parseElement(Element element) {
        System.out.print("<" + element.getTagName());
        NamedNodeMap attris = element.getAttributes();
        for (int i = 0; i < attris.getLength(); i++) {
            Attr attr = (Attr) attris.item(i);
            System.out.print(" " + attr.getName() + "=\"" + attr.getValue() + "\"");
        }
        System.out.println(">");

        NodeList nodeList = element.getChildNodes();
        Node childNode;
        for (int temp = 0; temp < nodeList.getLength(); temp++) {
            childNode = nodeList.item(temp);

            // 判断是否属于节点
            if (childNode.getNodeType() == Node.ELEMENT_NODE) {
                // 判断是否还有子节点
                if(childNode.hasChildNodes()){
                    parseElement((Element) childNode);
                } else if (childNode.getNodeType() != Node.COMMENT_NODE) {
                    System.out.print(childNode.getTextContent());
                }
            }
        }
        System.out.println("</" + element.getTagName() + ">");
    }



    /**
     * 递归解析Element
     * @param element
     */
    private static void parseElementTest(Element element) {
        System.out.print("<" + element.getTagName());
        NamedNodeMap attris = element.getAttributes();
        for (int i = 0; i < attris.getLength(); i++) {
            Attr attr = (Attr) attris.item(i);
            System.out.print(" " + attr.getName() + "=\"" + attr.getValue() + "\"");
        }
        System.out.println(">");

        NodeList nodeList = element.getChildNodes();
        Node childNode;
        for (int temp = 0; temp < nodeList.getLength(); temp++) {
            childNode = nodeList.item(temp);

            // 判断是否属于节点
            if (childNode.getNodeType() == Node.ELEMENT_NODE) {
                // 判断节点是否为空
                if(StringUtils.isNotBlank(childNode.getNodeName())){
                    parseElement((Element) childNode);
                } else if (childNode.getNodeType() != Node.COMMENT_NODE) {
                    System.out.print(childNode.getTextContent());
                }
            }
        }
        System.out.println("</" + element.getTagName() + ">");
    }


// XmlUtil.getElements 根据节点名获得子节点列表
// XmlUtil.getElement 根据节点名获得第一个子节点
// XmlUtil.elementText 根据节点名获得第一个子节点
// XmlUtil.transElements 将NodeList转换为Element列表
}
